import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserController } from './user/user.controller';
import { UserModule } from './user/user.module';
import { ChartModule } from './chart/chart.module';
import { UserService } from './user/user.service';
import { ListModule } from './list/list.module';
import { ConfigModule } from './config/config.module'
import { UploadModule } from './upload/upload.module';
import { PipelineModule } from './pipeline/pipeline.module';
import { RoleModule } from './role/role.module';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  // imports: [UserModule, ChartModule, ListModule, ConfigModule],             // 当使用命令创建了新的模块，这里会自动引入, 手动创建的模块需要手动引入
  // imports: [UserModule, ChartModule, ListModule, ConfigModule.forRoot({url: "/new"}), UploadModule, PipelineModule, RoleModule],     // 引入了configModule，这样前面的模块里就可使用它里面的内容了
  imports: [UserModule, ChartModule, ListModule, ConfigModule.forRoot({url: "/new"}), 
            UploadModule, PipelineModule, RoleModule,
            TypeOrmModule.forRoot({           // app.module.ts 注册，进行以下配置
              type: "mysql", //数据库类型
              username: "root", //账号
              password: "123456", //密码
              host: "localhost", //host
              port: 3306,       // 端口
              database: "myuser", //库名
              // entities: [__dirname + '/**/*.entity{.ts,.js}'], //实体文件，自动匹配（找）各个文件下的entity文件
              synchronize:true,       //synchronize字段代表是否自动将实体类同步到数据库，生产环境请关闭该字段
              retryDelay:500,         //重试连接数据库间隔
              retryAttempts:10,       //重试连接数据库的次数
              autoLoadEntities:true,  //如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中, 推荐使用这个，自动加载实体类
            })],
  controllers: [AppController, UserController],             // 可以注册其他模块的控制器
  // 提供者，可以被注入到其他地方，使用@Injectable()装饰器修饰的类
  // providers: [AppService, UserService],
  // 可以这样
  providers: [{
    // provide: 'AppService',   
    provide: 'ABC',    // 名字可以随便定义，不过在使用的时候在 constructor 需要用 @Inject('ABC') 引入
    useClass: AppService,
  },{
    provide: 'Test',
    useValue: ['a', 'b', 'c']         // 自定义值，可以是基本类型，可以是一个函数，也可以是一个对象，使用时是直接返回‘值’的，controller中看使用
  },
  // {
  //   provide: 'Fac',
  //   // useFactory: () => {                   // 工厂模式，返回一个对象
  //   //   if(2>1) {
  //   //     return {name: 'fac'};
  //   //   }
  //   //   return {name: 'fac'};
  //   // }
  //   inject: [AppService],                   // 注入其他提供者
  //   // useFactory: (appService:AppService) => {                   // 注入后，这里就当一个参数传过来了
  //   //   console.log(appService.getHello());
      
  //   //   return 'sss';
  //   // }
  //   // async useFactory (appService:AppService) {                   // 异步的方式
  //    useFactory: async (appService:AppService) => {                   // 异步的方式
      
  //     return await new Promise((resolve, reject) => {
  //       setTimeout(() => {
  //         resolve('sss');
  //       }, 1000);
  //     })
  //   }
  // },
   UserService],
})
export class AppModule {}
